/**
 * 一个根据Model控制View的显示播放滚动等操作的控制器
 * @constructor 实例化
 */
function LrcPlayer() {
    // do nothing
}


// 初始化, 在每次play后调用
LrcPlayer.prototype._init = function () {
    this.song = null;   // SongModel
    this.last = 0;      // 最近一次显示的歌词序号(base-0)
    this.v = null;      // 视图
    if (this.circle) {
        this.circle.stop(); // 保证终止上个循环器
        this.circle = null;
    }
}


/**
 * 开始播放直到SetModel被调用, View才会相应的受到控制
 */
LrcPlayer.prototype.play = function () {
    this._init();

    var me = this;
    var start = new Date().getTime(); // 开始时间点
    this.circle = new valaxyCircle({
        execute: function () {

            // 没有Model的情况
            if (!me.song) {
                return;
            }


            // 流程判定
            var cost = new Date().getTime() - start; // 当前进行的时间
            var next = me.last;
            while (next < me.song.lrcs.length && cost >= me.song.lrcs[next].time) {
                next++;
            }

            me._onplay(cost, next);

            // 最后一句歌词,停止
            if (next >= me.song.lrcs.length) {
                me.circle.stop();
                return;
            }
        },
        timeout: 400
    });
}


/**
 * 设置相关的LrcModel, 可以在play调用后适当的时候设置, 控制器会自动协调
 * @param model 一个LrcModel实例
 */
LrcPlayer.prototype.setModel = function (model) {
    this.song = model;

    // 配置视图
    this.v = new LrcView({
        dom: $('#db_lyric'),
        height: 120,
        count: 6,
        lrcs: model.lrcs
    });
}


/**
 * 出错时调用
 */
LrcPlayer.prototype.error = function () {
    this.v = new LrcView({
        dom: $('#db_lyric'),
        height: 120,
        text: '载入歌词文本失败'
    });
}


/**
 * 执行滚动时触发
 * @param cost 当前耗时
 * @param next 下一句序号
 */
LrcPlayer.prototype._onplay = function (cost, next) {
    if (this.last == next) {
        return;
    }

    var timeTag = Math.floor(cost / 60000) + ':' + (Math.floor(cost / 1000) - Math.floor(cost / 60000) * 60); // mm:ss
    console.log(timeTag + ':' + this.song.lrcs[next - 1].text);
    this.v.next(next - 1);
    this.last = next;
}